Security Hub の標準の有効化を AWS CDK で IaC 化してみた
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS Security Hub は、AWS 環境のセキュリティ状態を監視するサービスです。Security Hub は、AWS のセキュリティベストプラクティスに準拠しているかどうかを確認するための標準コントロールを提供しています。
今回は、Security Hub の標準の有効化を AWS CDK で IaC 化してみました。
やってみた
CDK コード
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as securityhub from 'aws-cdk-lib/aws-securityhub';
export class MainStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: cdk.StackProps) {
super(scope, id, props);
const region = cdk.Stack.of(this).region;
// // 参考:Security Hub 自体を有効化する場合
// new securityhub.CfnHub(this, 'SecurityHub', {
// enableDefaultStandards: false,
// });
// CIS AWS Foundations Benchmark v1.4.0 標準を有効化する
new securityhub.CfnStandard(this, 'CisAwsFoundationsBenchmarkv140', {
standardsArn: `arn:aws:securityhub:${region}::standards/cis-aws-foundations-benchmark/v/1.4.0`,
});
}
}
AWS CDK では Security Hub の L2 コンストラクトが提供されていないため、L1 の CfnStandard
を使って標準を有効化しています。
動作確認
デプロイ前は該当の標準は有効化されていません。
前述の CDK コードをデプロイします。
デプロイ後に Security Hub のコンソールを確認すると、CIS AWS Foundations Benchmark v1.4.0 が有効化されていることが確認できます。
次に、CDK コードから CfnStandard
のリソースを削除してデプロイしてみます。
diff --git a/lib/main-stack.ts b/lib/main-stack.ts
index e702cca..c2c0182 100644
--- a/lib/main-stack.ts
+++ b/lib/main-stack.ts
@@ -12,10 +12,5 @@ export class MainStack extends cdk.Stack {
// new securityhub.CfnHub(this, 'SecurityHub', {
// enableDefaultStandards: false,
// });
-
- // CIS AWS Foundations Benchmark v1.4.0 標準を有効化する
- new securityhub.CfnStandard(this, 'CisAwsFoundationsBenchmarkv140', {
- standardsArn: `arn:aws:securityhub:${region}::standards/cis-aws-foundations-benchmark/v/1.4.0`,
- });
}
}
デプロイ後に Security Hub のコンソールを確認すると、CIS AWS Foundations Benchmark v1.4.0 が無効化されていることが確認できます。
その他
標準の Arn の確認方法
CfnStandard
では有効化したい標準の Arn を指定する必要があります。Arn の確認は AWS CLI を使うのが便利です。確認したい標準をマネジメントコンソールから一度有効化し、get-enabled-standards
で取得できます。
カスタムリソースを使う場合
当初、CfnStandard
の存在を知らずカスタムリソースで有効化する方法を考えていました。カスタムリソースを使う場合は下記のようになります。
const region = cdk.Stack.of(this).region;
const accountId = cdk.Stack.of(this).account;
// Security Hub 標準 CIS AWS Foundations Benchmark を有効化する
new cr.AwsCustomResource(this, 'CisAwsFoundationsBenchmarkEnabler', {
onCreate: {
service: 'SecurityHub',
action: 'batchEnableStandards',
parameters: {
StandardsSubscriptionRequests: [
{
StandardsArn: `arn:aws:securityhub:${region}::standards/cis-aws-foundations-benchmark/v/1.4.0`,
},
],
},
physicalResourceId: cr.PhysicalResourceId.of(
'CisAwsFoundationsBenchmarkEnabler'
),
},
onDelete: {
service: 'SecurityHub',
action: 'batchDisableStandards',
parameters: {
StandardsSubscriptionArns: [
`arn:aws:securityhub:${region}:${accountId}:standards/cis-aws-foundations-benchmark/v/1.4.0`,
],
},
physicalResourceId: cr.PhysicalResourceId.of(
'CisAwsFoundationsBenchmarkEnabler'
),
},
policy: cr.AwsCustomResourcePolicy.fromStatements([
new iam.PolicyStatement({
actions: [
'securityhub:BatchEnableStandards',
'securityhub:BatchDisableStandards',
],
resources: ['*'],
}),
]),
});
なお、有効化時に StandardsSubscriptionRequests
で指定する標準 Arn と、無効化時に StandardsSubscriptionArns
で指定する標準 Arn は異なるので注意が必要です。両者は似ていますが無効化時は Arn 内に AWS アカウント ID が必要になります。
削除時に Arn が異なると下記のようなエラーが発生します。
Received response status [FAILED] from custom resource. Message returned: Account id XXXXXXXXXXXX is not authorized to perform action on resource: arn:aws:securityhub:ap-northeast-1::standards/cis-aws-foundations-benchmark/v/1.4.0 (RequestId: 341e8d6d-d3bf-478d-867b-d623ebf5de3a)
おわりに
AWS CDK で Security Hub の標準を有効化する方法を紹介しました。
この記事がどなたかの AWS セキュリティ設定の IaC 化の取り組みの参考になれば幸いです。
参考
以上